/* ========================================================================= */
/* ------------------------------------------------------------------------- */
/*!		
  \file			abstractfilter.cc
  \date			Aug 2011
  \author		TNick

  \brief		Contains the implementation for AbstractFilter class


 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @n
 Please read ReadMe.txt and Licence.txt in root folder @n
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @n

*/
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
//
//
//
//
/*  INCLUDES    ------------------------------------------------------------ */

#include    <gui/mainwindow.h>
#include    <data_store/pagedata.h>
#include	"abstractfilter.h"

/*  INCLUDES    ============================================================ */
//
//
//
//
/*  CLASS    --------------------------------------------------------------- */

/// keep track of the filters
QList<AbstractFilter*>   AbstractFilter::filt_list;


extern MainWindow *     g_MW;


/* ------------------------------------------------------------------------- */
AbstractFilter::~AbstractFilter	(void)
{
    /* extract from the chain, if present */
    int i = filt_list.indexOf(this);
    if (i != -1)
        filt_list.removeAt(i);

}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
bool        AbstractFilter::addIfPasses         (PageData * pg_data)
{
    if (passesFilter(pg_data))
        {
            filt_in.prepend(pg_data);
            return true;
        }
    else
        {
            return false;
        }
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
bool        AbstractFilter::delIfPasses         (PageData * pg_data)
{
    int idx = filt_in.indexOf(pg_data);
    if (idx != -1)
        {
            filt_in.removeAt(idx);
            return true;
        }
    else
        {
            return false;
        }
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
bool        AbstractFilter::hasPage             (PageData * pg_data)
{
    if (filt_in.indexOf(pg_data) != -1)
        {
            return true;
        }
    else
        {
            return false;
        }
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
int         AbstractFilter::registerFilter  (AbstractFilter * new_filter)
{
    filt_list.append(new_filter);
    return filt_list.count() - 1;
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
bool        AbstractFilter::pagePasses      (PageData * pg_data)
{
    for (int i = 0; i < filt_list.count(); i++)
        {
            if (filt_list[i]->active())
                {
                    if (filt_list[i]->passesFilter(pg_data))
                        {
                            return true;
                        }
                }
        }
    return false;
}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
void         AbstractFilter::killFilters         (void)
{
    foreach (AbstractFilter* itr_flt, filt_list) {
        delete itr_flt;
    }
}
/* ========================================================================= */

/*  CLASS    =============================================================== */
//
//
//
//
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
